/**
 * 用法：
 * <input type="text" id="keyword"  lar-select="" lar-option="--不限--"  lar-model="">
 * lar-select 下拉框数据
 * lar-option 提供额外选择项(如：不限、请选择、不限等)
 * lar-multi  是否多选，默认单选
 * lar-search-able 是否显示搜索框，默认不显示
 * lar-model    要绑定的数据(字符串，数组)都支持
 * lar-config   继承产品的配置(扩展isId属性默认为true)
 * 
 * 说明：
 *     字符串以默认以逗号隔开，如('1003,1002,1001')
 * @todo 读取数据可以统一在指令方法中开发
 * @author gaodsh@css.com.cn
 */
define(['jquery','PDUtilDir/inputSelect'], function ($, InputSelect) {
	
    function _isArray(obj) {
        return (typeof obj == 'object') && obj.constructor == Array;
    }

    function _isString(str) {
        return (typeof str == 'string') && str.constructor == String;
    }	
	
    function _setVal(larModel, data, config) {
    	$(data).each(function(i,item){
    		if('' === item){
    			data.splice(i,1);
    		}
    	});
    	if(larModel !== null){
            if (_isArray(larModel)) {
                return data;
            } else if (_isString(larModel)) {
                if (config.multi) {
                    return data.join(',');
                }
                return data[0];
            }
    	}
        return data.join(',');
    }
    
    function _initData(larModel, config) {
    	if(larModel !== null){
    		if (_isArray(larModel)) {
                return larModel;
            } else if (_isString(larModel)) {
                if (config.multi) {
                    return larModel.replace(/\s/g, '').split(',');
                }
                return [larModel];
            }
    	}
        return [''];
    }	
    
	//主程序
	function createDrt(scope, element, attrs, ctrls){
		var option = attrs.larOption;
        var config = {
            id: attrs.id,
            multi: attrs.larMulti ? attrs.larMulti : false,
            simpleData: true,
            key: {
                id: 'deptCode',
                name: 'deptName',
                data: 'data'
            },
            searchAble: attrs.larSearchAble ? attrs.larSearchAble : false
        };
        
        var larConfig = scope.larConfig;
        if(larConfig){
        	config = $.extend(config,larConfig);
        	if(!config.isId){
        		config.id = 'larSelectId' + Math.floor(Math.random() * 1000000);
        	}
        }
        element[0].id = config.id;
        config.data =  scope.zeroSelect ? scope.zeroSelect : [];
        config.initData =  [''];
        config.callback= function (data, objArr) {
        	scope.$apply(function() {
        		scope.larModel = _setVal(scope.larModel, data, config);
        	});
        };
        var select = InputSelect(config);
        var id = config.key.id;
        var defOption = {};
		defOption[config.key.id ? config.key.id : 'id'] = '';
		defOption[config.key.name ? config.key.name : 'name'] = option;
		
        scope.$watch('zeroSelect', function () {
            var data = scope.zeroSelect;
            if (data && option) {
                if (data.length > 0 && data[0][config.key.id] === '') {
                    data.splice(0, 1);
                }
                data.unshift(defOption);
            } else if (!option && data && data.length > 0 && data[0][config.key.id] === '') {
                data.splice(0, 1);
            }
            select.config.initData = _initData(scope.larModel, select.config);
            select.refreshPanel(data);
        });
        
        scope.$watch('larModel', function () {
        	select.dataInit(_initData(scope.larModel, select.config));
        });

	}
	
   return {
	   createDrt : createDrt
   }; 
});